﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace SST_DA
{
    public class HabilidadDA
    {
        /// <summary>
        /// Lista todas las habilidades que no han sido borradas.
        /// </summary>
        /// <returns>Un Habilidad[] con todas las habilidades</returns>
        public static Habilidad[] ListarHabilidades()
        {
            const string query = "SELECT HabilidadID, NombreHabilidad, Circuito FROM Habilidad WHERE FechaBorrado IS NULL";
            DataTable resultado = BaseDatos.ExecuteQuery(query, new string[] { }, new object[] { });
            if (resultado == null)            
                return null;            
            int CantidadHabilidades = resultado.Rows.Count;
            Habilidad[] Habilidades = new Habilidad[CantidadHabilidades];
            for (int i = 0; i < CantidadHabilidades; i++)
            {
                Habilidades[i] = new Habilidad(resultado.Rows[i].ItemArray[1].ToString(), int.Parse(resultado.Rows[i].ItemArray[2].ToString()));
                Habilidades[i].setHabilidadID(int.Parse(resultado.Rows[i].ItemArray[0].ToString()));
            }
            return Habilidades;
        }//public Habilidad[] ListarHabilidades() { 

        /// <summary>
        /// Lista todas las habilidades de un circuito
        /// </summary>
        /// <param name="CircuitoID">El ID del circuito al cual se le van a buscar todas las habilidades.</param>
        /// <returns>Un Habilidad[] con todas la habilidades del circuito indicado</returns>
        public static Habilidad[] ListarHabilidadesPorCircuito(int[] circuitos) {
            const string query = "SELECT HabilidadID, NombreHabilidad, Circuito FROM Habilidad WHERE Circuito = @circuito AND FechaBorrado IS NULL";
            List<Habilidad> habilidades = new List<Habilidad>();
            for (int i = 0; i < circuitos.Length; i++)
            {
                DataTable resultado = BaseDatos.ExecuteQuery(query, new string[] { "circuito" }, new object[] { circuitos[i] });
                if (resultado == null)
                    return null;
                for (int j = 0; j < resultado.Rows.Count; j++)
                {
                    habilidades.Add(new Habilidad(int.Parse(resultado.Rows[j].ItemArray[0].ToString())
                                                    , resultado.Rows[j].ItemArray[1].ToString()
                                                    , int.Parse(resultado.Rows[j].ItemArray[2].ToString())));                
                }
            }
            return habilidades.ToArray<Habilidad>();
        }//public static Habilidad[] ListarHabilidadesPorCircuito() { 

        /// <summary>
        /// Retaorna todas las hablidades de un informatico
        /// </summary>
        /// <param name="Informatico">El ID del informatico</param>
        /// <returns>Un DataTAble con todas las habiliades</returns> 
        public static DataTable GetHabilidadesDeInformatico(int Informatico)
        {
            const string query = "SELECT h.NombreHabilidad, h.Circuito"
                                + " FROM "
                                + " Informatico as i "
                                + " INNER JOIN InformaticoHabilidad as ih ON i.InformaticoID=ih.InformaticoID"
                                + " INNER JOIN Habilidad as h ON ih.HabilidadID = h.HabilidadID"
                                + " WHERE i.InformaticoID = @ID AND ih.FechaBorrado IS NULL";

            return BaseDatos.ExecuteQuery(query, new string[] { "@ID" }, new object[] { Informatico });
        }//public static DataTable GetHabilidadesDeInformatico(string NombreInformatico)

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public static Habilidad GetHabilidad(string nombre)
        {
            object[] parametros = { nombre };
            string[] NombreParametros = { "@nombre" };
            const string query = "SELECT h.HabilidadID, h.NombreHabilidad, h.Circuito FROM Habilidad as h WHERE h.NombreHabilidad=@nombre AND h.FechaBorrado IS NULL";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            //en caso de que el ID no exista devuelve NULL
            if (result == null || result.Rows.Count == 0)
                return null;
            return (new Habilidad(int.Parse(result.Rows[0].ItemArray[0].ToString()), result.Rows[0].ItemArray[1].ToString(), int.Parse(result.Rows[0].ItemArray[2].ToString())));            
        }//public static bool GetHabilidad(int ID) { 

        public static Habilidad GetHabilidad(int id)
        {
            object[] parametros = { id };
            string[] NombreParametros = { "@id" };
            const string query = "SELECT h.HabilidadID, h.NombreHabilidad, h.Circuito FROM Habilidad as h WHERE h.HabilidadID=@id AND h.FechaBorrado IS NULL";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            //en caso de que el ID no exista devuelve NULL
            if (result == null || result.Rows.Count == 0)
                return null;
            return (new Habilidad(int.Parse(result.Rows[0].ItemArray[0].ToString()), result.Rows[0].ItemArray[1].ToString(), int.Parse(result.Rows[0].ItemArray[2].ToString())));
        }//public static bool GetHabilidad(int ID) { 

        public static bool AgregarHabilidad(Habilidad h) {
            object[] parametros = { h.NombreHabilidad, h.CircuitoID };
            string[] NombreParametros = { "@nombre", "@circuito" };
            const string UpdateQuery = "UPDATE Habilidad SET FechaBorrado = NULL WHERE NombreHabilidad = @nombre AND Circuito = @circuito";
            int rows = BaseDatos.ExecuteNonQuery(UpdateQuery, NombreParametros, parametros);
            if(rows == 0){
                const string query = "INSERT INTO Habilidad(NombreHabilidad, Circuito) VALUES(@nombre, @circuito)";
                if (BaseDatos.ExecuteNonQuery(query, NombreParametros, parametros) > 0)
                    return true;
                return false;
            }//if(rows == 0){
            return rows > 0;
        }//public static bool AgregarHabilidad(string nombre) { 

        public static bool ModificarHabilidad(int HabilidadID, string nombre, int circuito) {
            object[] parametros = { HabilidadID, nombre, circuito };
            string[] NombreParametros = { "@ID", "@nombre", "@circuito" };
            const string query = "UPDATE Habilidad SET NombreHabilidad = @nombre, circuito = @circuito WHERE HabilidadID =@ID AND FechaBorrado IS NULL";
            return BaseDatos.ExecuteNonQuery(query, NombreParametros, parametros) > 0; 
        }//public static bool ModificarHabilidad(int HabilidadID, string nombre) { 


        public static bool EliminarHabilidad(int id)
        {
            object[] parametros = { id };
            string[] NombreParametros = { "@ID" };
            const string query = "UPDATE Habilidad SET FechaBorrado = GETDATE() WHERE HabilidadID = @ID";
            return  BaseDatos.ExecuteNonQuery(query, NombreParametros, parametros) > 0;
        }

        public static bool InformaticoTieneHabilidad(string InformaticoNombre, string NombrehHabilidad)
        {
            object[] parametros = { InformaticoNombre, NombrehHabilidad };
            string[] NombreParametros = { "@InformaticoNombre", "@NombreHabilidad" };
            const string query = "SELECT COUNT(i.InformaticoID) FROM InformaticoHabilidad as ih INNER JOIN Habilidad as h ON ih.HabilidadID=h.HabilidadID INNER JOIN Informatico as i ON ih.InformaticoID=i.InformaticoID WHERE h.HabilidadID=@NombreHabilidad AND i.InformaticoID=@InformaticoNombre AND h.FechaBorrado IS NULL AND ih.FechaBorrado IS NULL";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            return int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0;
        }//public static bool InformaticoTieneHabilidad(string InformaticoNombre, string NombrehHabilidad)

        public static bool AgregarHabilidadAInformatico(int InformaticoID, int HabilidadID) {
            object[] parametros = { InformaticoID, HabilidadID };
            string[] NombreParametros = { "@informatico", "@habilidad" };
            const string query = "INSERT INTO InformaticoHabilidad(InformaticoID, HabilidadID) VALUES(@informatico, @habilidad)";
            int rows = BaseDatos.ExecuteNonQuery(query, NombreParametros, parametros);
            return rows > 0;
        }//public static bool AgregarHabilidadAInformatico() { 

        public static bool EliminarHabilidadDeInformatico(string NombreInformatico, string NombreHabilidad)
        {
            object[] parametros = { NombreInformatico, NombreHabilidad };
            string[] NombreParametros = { "@Informatico", "@NombreHabilidad" };
            const string query = "UPDATE InformaticoHabilidad Set FechaBorrado = GETDATE()"
                                + " WHERE InformaticoID=@Informatico"
                                + " AND HabilidadID=(SELECT HAbilidadID FROM Habilidad WHERE NombreHabilidad = @NombreHabilidad)";
            int rows = BaseDatos.ExecuteNonQuery(query, NombreParametros, parametros);
            return rows > 0;
        }//public static bool EliminarHabilidadDeInformatico(string NombreInformatico, string NombreHabilidad)

        public static bool IsHabilidadEnCircuito(int CircuitoID, int HabilidadID) {
            object[] parametros = { CircuitoID, HabilidadID };
            string[] NombreParametros = { "@Circuito", "@Habilidad" };
            const string query = "exec IsHabilidadEnCircuito @Circuito, @Habilidad";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if(int.Parse(result.Rows[0].ItemArray[0].ToString()) == 1){
                return true;
            }else{
                return false;
            }
        }//public static bool IsHabilidadEnCircuito(int CircuitoID, int HabilidadID) { 
    
    }//class HabilidadDA
}//namespace SST_DA
